/*
 * Archivo: prueba
 *
 * @author Daniel Bruzual
 * @author Manuel Gómez
 * @author Marilyn Nowacka
 * @author Sabrina Fernández
 */

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;

import nanoxml.XMLElement;
import nanoxml.XMLParseException;

/**
 * Clase que controla la sincronización de eventos
 */
class Sincronizacion {
   String proc;
   boolean estado = false;
   
	/**
	 * Toma un string que pasa el hilo productor
     */
	synchronized String get () {
		if (!estado)
			try {
				wait();
			} catch (InterruptedException e ) {
				System.out.println("Error\n");
			}
		System.out.println("Consume: " + proc);
		estado = false;
		notify();
		return proc;
   }

	/**
	 * Pasa un string al hilo consumidor
	 */
	synchronized void put (String proc) {
		if (estado)
			try {
				wait();
			} catch (InterruptedException e ) {
				System.out.println("Error\n");
			}
		this.proc = proc;
		estado = true;
		System.out.println("Produce: " + proc);
		notify();
   }
}

/**
 * Clase que se encarga de leer el archivo y enviar los procesos al hilo principal.
 */
class Lector_Productor implements Runnable {
	Sincronizacion q;

	Lector_Productor(Sincronizacion q) {
		this.q = q;
		new Thread(this,"Productor").start();
	}

	public void run() {
		q.get();
		int i = 0;
		while(true) {
			q.put("P" + i++);
		}
	}
}

class Interfaz_Consumidor implements Runnable {
	Sincronizacion q;
	char opcion = 0;
	String menu = "[p] imprimir \n [s] ejecutar siguiente instruccion \n [q] salir del sistema";
	BufferedReader entrada;

	Interfaz_Consumidor(Sincronizacion q) {
		this.q = q;
		new Thread(this,"Consumidor").start();
	}

	public void run() {
		q.put("Hola, este es el archivo\n");
/*		while(true) {
			q.get();
			// Ejecutar paso en q.
		}
*/

//flujo principal de control
        while(true) {
            System.out.println(menu);
            entrada = new BufferedReader(new InputStreamReader(System.in));
            try {
                opcion = (char) entrada.read();
            } catch (IOException e) {
				System.out.println("Error\n");
            } /*
            if (opcion == 'p') { //print
                    //Llamar a la impresion de la memoria (Manejador de memoria)
                Control.imprimirProcesos();
                Control.imprimirMemoria();
            }  else if (opcion == 's') { //step
                //Ejecutar siguiente instruccion
                Control.ejecutarSigIns();
            } else if (opcion == 'q'){
                System.exit(0);
            } else {
                System.out.println("Opcion no valida. Opciones: p (imprimir), s (step), q (quit)");
            }*/
        }
	}
}

class ejemploThread {
	
	public static void main(String args[]) {
		String filename = null;
        Controlador Control = new Controlador();

        try {
            filename = args[0];
            Control.parseArchivo(filename);
        } catch (IndexOutOfBoundsException e) {
			System.out.println("Error\n");
        }

		Sincronizacion q = new Sincronizacion();
		new Lector_Productor(q);
		new Interfaz_Consumidor(q);
	}
}

